package com.ra.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.ra.exception.BizException;
import com.ra.mapper.ArticleTagMapper;
import com.ra.pojo.ArticleTag;
import com.ra.pojo.RespPageBean;
import com.ra.pojo.Tag;
import com.ra.mapper.TagMapper;
import com.ra.pojo.dto.ConditionDTO;
import com.ra.pojo.dto.TagAdminDTO;
import com.ra.pojo.dto.TagDTO;
import com.ra.service.ITagService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ra.utils.BeanCopyUtil;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 今晚几点睡_Ada
 * @since 2023-03-09
 */
@Service
public class TagServiceImpl extends ServiceImpl<TagMapper, Tag> implements ITagService {

    @Autowired
    private TagMapper tagMapper;
    @Autowired
    private ArticleTagMapper articleTagMapper;

    @Override
    public RespPageBean<TagAdminDTO> listTagsAdmin(ConditionDTO conditionDTO) {
       //  Page<TagAdminDTO> page = new Page<>(conditionDTO.getCurrent(),conditionDTO.getSize());
        PageHelper.startPage(conditionDTO.getCurrent(),conditionDTO.getSize());
        Page<TagAdminDTO> page  = tagMapper.listTagsAdmin(conditionDTO);
        return new RespPageBean<>(page.getTotal(),page.getResult());
    }
    @SneakyThrows
    @Override
    public void saveOrUpdateTag(TagDTO tagDTO) {
        Tag dbTag = tagMapper.selectOne(new LambdaQueryWrapper<Tag>()
                .select(Tag::getId)
                .eq(Tag::getTagName, tagDTO.getTagName()));
        if (Objects.nonNull(dbTag) && !dbTag.getId().equals(tagDTO.getId())) {
            throw new BizException("标签名已存在");
        }
        Tag tag = BeanCopyUtil.copyObject(tagDTO, Tag.class);
        System.out.println("tag = " + tag);
        this.saveOrUpdate(tag);
    }
    @SneakyThrows
    @Override
    public void delTag(List<Integer> tagsIdList) {
        Integer count = articleTagMapper.selectCount(new LambdaQueryWrapper<ArticleTag>()
                .in(ArticleTag::getTagId, tagsIdList));
        if (count > 0) {
            throw new BizException("删除失败，该标签下存在文章");
        }
        //deleteBatchIds是一个MyBatis中的方法，用于通过多个ID进行删除。
        // 这个方法通常用于批量删除，它可以删除一个或多个ID所匹配的记录
        // 。在使用deleteBatchIds方法时，需要传入一个List类型的参数，
        // 其中包含了多个ID。这些ID所对应的记录将被删除。
        // deleteBatchIds方法的具体实现可以参考
        tagMapper.deleteBatchIds(tagsIdList);
    }

    @Override
    public List<TagAdminDTO> listTagsAdminBySearch(ConditionDTO conditionDTO) {
        List<Tag> tags = tagMapper.selectList(new LambdaQueryWrapper<Tag>()
                .like(StringUtils.isNotBlank(conditionDTO.getKeywords()), Tag::getTagName, conditionDTO.getKeywords())
                .orderByDesc(Tag::getId));
        return BeanCopyUtil.copyList(tags, TagAdminDTO.class);
    }

}
